﻿#ifndef SPECIFICATTRPANELADAPTER_H
#define SPECIFICATTRPANELADAPTER_H

#include <QObject>
#include <QStackedWidget>
#include <QComboBox>
#include <QRadioButton>
#include <QLineEdit>
#include <QMap>
#include <QVariant>
#include <QVBoxLayout>

#include "common/datatypes.h"
#include "common/deviceattributes.h"

/**
 * @brief SpecificAttrPanelAdapter
 * @details 适配右侧“特有属性”面板，负责将各设备的特性控件装入堆栈并按角色切换。
 */
class SpecificAttrPanelAdapter : public QObject
{
    Q_OBJECT
public:

    /**
     * @brief SpecificAttrPanelAdapter::SpecificAttrPanelAdapter
     * @details 构造适配器并注入所有依赖控件。
     * @param scrollAreaContainer 包裹堆栈的容器。
     * @param stack 存放各角色页面的堆栈控件。
     * @param wSignalGenerator 信号发生器页面。
     * @param sgMin 信号源最小值输入框。
     * @param sgMax 信号源最大值输入框。
     * @param wAmplifier 功放页面。
     * @param paInputMax 功放输入上限。
     * @param paCplConstRadio 功放耦合常数单选。
     * @param paCplConstEdit 功放耦合常数输入框。
     * @param paCplTableRadio 功放耦合表单选。
     * @param paFwdTable 功放正向耦合表选择。
     * @param paRevTable 功放反向耦合表选择。
     * @param wPowerMeter 功率计页面。
     * @param pmChannel 功率计通道选择。
     * @param wAntenna 天线页面。
     * @param antH 水平增益表选择。
     * @param antV 垂直增益表选择。
     * @param wConnector 连接器页面。
     * @param conConstRadio 连接器常数单选。
     * @param conConstEdit 连接器常数输入框。
     * @param conTableRadio 连接器表单选。
     * @param conTableBox 连接器表选择。
     * @param switchWidget 开关设置区域。
     * @param switchSel 开关路径选择。
     * @param switchCh 开关通道选择。
     * @param wFieldProbe 场探头页面。
     * @param fpCorr 场探头修正表选择。
     * @param wCurrentProbe 电流探头页面。
     * @param cpTransducer 电流探头换能器选择。
     * @param wReceiver 接收机空页面。
     * @param parent Qt 父对象。
     */
    explicit SpecificAttrPanelAdapter(
        QWidget *scrollAreaContainer,
        QStackedWidget *stack,

        // SignalGenerator
        QWidget *wSignalGenerator, QLineEdit *sgMin, QLineEdit *sgMax,

        // Amplifier
        QWidget *wAmplifier, QLineEdit *paInputMax,
        QRadioButton *paCplConstRadio, QLineEdit *paCplConstEdit,
        QRadioButton *paCplTableRadio, QComboBox *paFwdTable, QComboBox *paRevTable,

        // PowerMeter
        QWidget *wPowerMeter, QComboBox *pmChannel,

        // Antenna
        QWidget *wAntenna, QComboBox *antH, QComboBox *antV,

        // Connector
        QWidget *wConnector, QRadioButton *conConstRadio, QLineEdit *conConstEdit,
        QRadioButton *conTableRadio, QComboBox *conTableBox,
        QWidget *switchWidget, QComboBox *switchSel, QComboBox *switchCh,

        // FieldProbe
        QWidget *wFieldProbe, QComboBox *fpCorr,

        // CurrentProbe
        QWidget *wCurrentProbe, QComboBox *cpTransducer,

        // Receiver（无特有字段也给个空页，便于切换）
        QWidget *wReceiver,

        QObject *parent = nullptr);

    /**
     * @brief SpecificAttrPanelAdapter::showRole
     * @details 根据角色切换到对应页面。
     * @param role 设备角色。
     */
    void showRole(DeviceRole role);

    // 从文档读数据灌入控件
    /**
     * @brief SpecificAttrPanelAdapter::loadFromDoc
     * @details 将模板文档数据填充至控件。
     * @param doc 模板文档。
     * @param role 目标设备角色。
     */
    void loadFromDoc(const HardwareTemplatePtr &doc, DeviceRole role);

signals:
    // 统一的“特有属性变更”信号：Presenter 收到后更新 Model
    /**
     * @brief SpecificAttrPanelAdapter::specificEdited
     * @details 当控件内容变更时发射的统一信号。
     * @param role 当前设备角色。
     * @param key 变更键路径。
     * @param value 变更值。
     */
    void specificEdited(DeviceRole role, const QString &key, const QVariant &value);

public slots:
    /**
     * @brief SpecificAttrPanelAdapter::refreshParameterTables
     * @details 刷新所有参数表下拉框内容。
     */
    void refreshParameterTables();

private:
    /**
     * @brief SpecificAttrPanelAdapter::addPage
     * @details 将页面添加进堆栈并返回索引。
     * @param w 需要添加的页面。
     * @return 页面的堆栈索引。
     */
    int addPage(QWidget *w);
    /**
     * @brief SpecificAttrPanelAdapter::setComboByParamId
     * @details 根据参数表 ID 设置下拉框选项。
     * @param cb 下拉框指针。
     * @param kind 参数表类型。
     * @param id 表 ID。
     */
    void setComboByParamId(QComboBox *cb, ParamTableKind kind, int id);
    /**
     * @brief SpecificAttrPanelAdapter::connectorForRole
     * @details 根据角色获取当前连接器配置。
     * @param doc 模板文档。
     * @param role 设备角色。
     * @return 对应连接器配置。
     */
    ConnectorConfigPtr connectorForRole(const HardwareTemplatePtr &doc, DeviceRole role) const;
    /**
     * @brief SpecificAttrPanelAdapter::wireUpSignals
     * @details 建立控件与统一信号之间的连接。
     */
    void wireUpSignals();

private:
    QWidget *container_ {nullptr};
    QStackedWidget *stack_ {nullptr};
    QMap<DeviceRole, int> roleToPage_;
    DeviceRole currentRole_ {DeviceRole::Undefined};

    // SG
    QWidget *wSignalGenerator_ {nullptr};
    QLineEdit *sgMin_ {nullptr};
    QLineEdit *sgMax_ {nullptr};

    // Amp
    QWidget *wAmplifier_ {nullptr};
    QLineEdit *paInputMax_ {nullptr};
    QRadioButton *paCplConstRadio_ {nullptr};
    QLineEdit *paCplConstEdit_ {nullptr};
    QRadioButton *paCplTableRadio_ {nullptr};
    QComboBox *paFwdTable_ {nullptr};
    QComboBox *paRevTable_ {nullptr};

    // PM
    QWidget *wPowerMeter_ {nullptr};
    QComboBox *pmChannel_ {nullptr};

    // Ant
    QWidget *wAntenna_ {nullptr};
    QComboBox *antH_ {nullptr};
    QComboBox *antV_ {nullptr};

    // Con
    QWidget *wConnector_ {nullptr};
    QRadioButton *conConstRadio_ {nullptr};
    QLineEdit *conConstEdit_ {nullptr};
    QRadioButton *conTableRadio_ {nullptr};
    QComboBox *conTableBox_ {nullptr};
    QWidget *switchWidget_ {nullptr};
    QComboBox *switchSel_ {nullptr};
    QComboBox *switchCh_ {nullptr};

    // FP
    QWidget *wFieldProbe_ {nullptr};
    QComboBox *fpCorr_ {nullptr};

    // CP
    QWidget *wCurrentProbe_ {nullptr};
    QComboBox *cpTransducer_ {nullptr};

    // RX
    QWidget *wReceiver_ {nullptr};
};

#endif // SPECIFICATTRPANELADAPTER_H
